﻿#region Acerca de...
/////////////////////////////////////////////////////////////////////////////
// Instituto Tecnológico de Costa Rica
// Proyecto: Administración de Proyectos de Investigación del Centro de 
//           Investigaciones en Computación
// Descripción: Clase de acceso a datos para tabla 'SGAPFROLES'
// Generado por Andrés Aguilar 
// Fecha: Martes, 10 de Enero de 2012, 09:15:00 p.m.
////////////////////////////////////////////////////////////////////////////
#endregion

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace API_CIC.CapaDatos
{
    public class cRolesDatos
    {
        /// <summary>
        /// Propósito: Ingresa un rol a la base de datos, incluidos los permisos
        /// </summary>
        public static void Ingresar(SGAPFROLE p_rol)
        {
            System.Nullable<int> p1 = p_rol.ID_ROL;
            p_rol.ID_ROL = p1.GetValueOrDefault();
            _datacontext.SGAPFROLEs.InsertOnSubmit(p_rol);
            
            //_datacontext.SGAPFROLEs.In
            try
            {
                _datacontext.SubmitChanges();
            }
            catch (Exception ex)
            {
                throw new ITCRException("cGestionRoles: :Ingresar: :Ocurrió un error.", ex);
            }
        }
        /// <summary>
        /// Propósito: Obtiene un rol con el ID_ROL (p_rol)
        /// </summary>
        public static SGAPFROLE GetRol(int p_rol)
        {
            IOrderedQueryable<SGAPFROLE> bs = (IOrderedQueryable<SGAPFROLE>)from roles in _datacontext.SGAPFROLEs
                                                                                  where roles.ID_ROL == p_rol
                                                                                  select roles;
            return bs.First();
        }

        public static SGAPFUSUARIO_ROL GetUsuarioRol(int p_rol, int p_usu, int p_proy)
        {
            IOrderedQueryable<SGAPFUSUARIO_ROL> bs = (IOrderedQueryable<SGAPFUSUARIO_ROL>)from uroles in _datacontext.SGAPFUSUARIO_ROLs
                                                                            where uroles.COD_ROL == p_rol && uroles.COD_USUARIO == p_usu 
                                                                            && uroles.COD_PROYECTO == p_proy
                                                                            select uroles;
            return bs.First();
        }

        /// <summary>
        /// Propósito: Modifica los datos de los roles y sus permisos
        /// </summary>
        public static void Modificar(SGAPFROLE p_rol)
        {
            var rol = (from u in _datacontext.SGAPFROLEs
                           where u.ID_ROL == p_rol.ID_ROL
                           select u).Single();

            var perrol = (from pr in _datacontext.SGAPFROL_PERMISOs
                          where pr.COD_ROL == p_rol.ID_ROL
                          select pr);
            
            
            System.Collections.IEnumerator enu = perrol.GetEnumerator();
            while (enu.MoveNext())
            {
                _datacontext.SGAPFROL_PERMISOs.DeleteOnSubmit((SGAPFROL_PERMISO)enu.Current);
            }
            _datacontext.SubmitChanges();
            rol.SGAPFROL_PERMISOs.AddRange(p_rol.SGAPFROL_PERMISOs);
            try
            {
                _datacontext.SubmitChanges();
            }
            catch (Exception ex)
            {
                throw new ITCRException("cGestionRoles: :Modificar: :Ocurrió un error.", ex);
            }
        }

        public static List<SGAPFROL_PERMISO> GetRolPermiso(int p_rol)
        {
            var permisos = (from per in _datacontext.SGAPFROL_PERMISOs
                            where per.COD_ROL == p_rol
                            select per);
            System.Collections.IEnumerator enu = permisos.GetEnumerator();
            List<SGAPFROL_PERMISO> lista = new List<SGAPFROL_PERMISO>();
            while (enu.MoveNext())
            {
                lista.Add((SGAPFROL_PERMISO)enu.Current);
            }
            return lista;
        }

        private static readonly LinqClasesDataContext _datacontext = new LinqClasesDataContext();
    }
}